package com.nowcoder.topic.string.middle;

import java.math.BigInteger;

/**
 * NC1 大数加法
 * @author d3y1
 */
public class NC1{
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
        return solution1(s, t);
//        return solution2(s, t);
//        return solution3(s, t);
    }

    /**
     * 模拟法
     * @param s
     * @param t
     * @return
     */
    private String solution1(String s, String t){
        if(s.equals("")){
            return t;
        }
        if(t.equals("")){
            return s;
        }

        return adder(s, t);
    }

    /**
     * 加法器
     * @param s
     * @param t
     * @return
     */
    private String adder(String s, String t){
        int sLen = s.length();
        int tLen = t.length();
        int len = Math.max(sLen, tLen);

        int carry = 0;
        int sum,sDigit,tDigit,digit;
        StringBuilder result = new StringBuilder();
        for(int i = 1; i <= len; i++){
            sDigit = (sLen-i >= 0) ? s.charAt(sLen-i)-'0' : 0;
            tDigit = (tLen-i >= 0) ? t.charAt(tLen-i)-'0' : 0;
            sum = sDigit + tDigit + carry;
            carry = sum / 10;
            digit = sum % 10;
            result.insert(0, digit);
        }
        if(carry > 0){
            result.insert(0, carry);
        }

        return result.toString();
    }

    /**
     * 库函数: BigInteger
     * @param s
     * @param t
     * @return
     */
    private String solution2(String s, String t){
        BigInteger bigIntegerS = new BigInteger(s);
        BigInteger bigIntegerT = new BigInteger(t);

        return bigIntegerS.add(bigIntegerT).toString();
    }

    /**
     * 模拟法: 简化
     * @param s
     * @param t
     * @return
     */
    private String solution3(String s, String t){
        int i = s.length()-1;
        int j = t.length()-1;

        // 进位
        int carry = 0;
        int sum,sDigit,tDigit,digit;
        StringBuilder result = new StringBuilder();
        while(i>=0 || j>=0 || carry > 0){
            sDigit = (i >= 0) ? s.charAt(i--)-'0' : 0;
            tDigit = (j >= 0) ? t.charAt(j--)-'0' : 0;
            sum = sDigit + tDigit + carry;
            carry = sum / 10;
            digit = sum % 10;
            result.insert(0, digit);
        }

        return result.toString();
    }
}